<?php
/**
  * 树型类    
  */
class Tree
{
	/**
	  * 生成树型结构所需要的2维数组
	  *   @var array
	  */
	public $arr = array();

	/**
	  * 生成树型结构所需修饰符号，可以换成图片
	  */
	public $icon = array('│','├','└');
	public $nbsp = "&nbsp;";
	public $ret = '';

	public function init($arr=array())
	{
       $this->arr = $arr;
	   $this->ret = '';
	   return is_array($arr);
	}

    /**
	  * 得到子级数组
	  * @param int
	  * @return array
	  */
	public function getChild($myid){
		$a = $newArr = array();
		if(is_array($this->arr)){
			foreach($this->arr as $id => $a){
				if($a['parent_id'] == $myid) $newArr[$id] = $a;
			}
		}
		return $newArr ? $newArr : false;
	}

    /**
	  * 递归获取所有子数据
	  * @param int
	  * @return string
	  */
	public function getChildString($myid){
		$child = $this->getChild($myid);
		if(is_array($child))
		{
			foreach($child as $id=>$a)
			{		
				@extract($a);
				$this->ret .= $id.',';
				$this->getChildString($id);
			}
		}
		return $this->ret;
	}

    /**
	  * 得到当前位置数组
	  * @param int
	  * @return array
	  */
	public function getPos($myid,&$newArr){
		$a=array();
		if(!isset($this->arr[$myid])) return false;
        $newArr[] = $this->arr[$myid];
		$pid = $this->arr[$myid]['parent_id'];
		if(isset($this->arr[$pid])){
		    $this->getPos($pid,$newArr);
		}
		if(is_array($newArr)){
			krsort($newArr);
			foreach($newArr as $v){
				$a[$v['id']] = $v;
			}
		}
		return $a;
	}

    /**
	  * 得到树型结构
	  * @param int ID，表示获得这个ID下的所有子级
	  * @param string 生成树型结构的基本代码，例如："<option value=\$id \$selected>\$spacer\$name</option>"
	  * @param int 被选中的ID，比如在做树型下拉框的时候需要用到
	  * @return string
	  */
	public function getTree($myid, $str, $sid = 0, $adds = ''){
		$number=1;
		$child = $this->getChild($myid);
		if(is_array($child)){
		    $total = count($child);
			foreach($child as $id=>$a){
				$j=$k='';
				if($number==$total){
					$j .= $this->icon[2];
				}else{
					$j .= $this->icon[1];
					$k = $adds ? $this->icon[0] : '';
				}
				$spacer = $adds ? $adds.$j : '';		
				@extract($a);
			    if($sid!=0)
				{
					$selected = $id==$sid ?"selected='selected'" : '';	
				}else{$selected='';}
				eval("\$nstr = \"$str\";");
				$this->ret .= $nstr;
				$nbsp = $this->nbsp;
				$this->getTree($id, $str, $sid, $adds.$k.$nbsp);
				$number++;
			}
		}
		return $this->ret;
	}

    /**
	  * 得到树型结构options
	  * @param int ID，表示获得这个ID下的所有子级
	  * @param string 生成树型结构的基本代码，例如："<option value=\$id \$selected>\$spacer\$name</option>"
	  * @param string 生成树型结构的基本代码，例如：" <optgroup label="\$spacer\$name"></optgroup>"
	  * @param int 被选中的ID，比如在做树型下拉框的时候需要用到
	  * @return string
	  */
	public function getTreeOptions($myid,$str,$str2,$sid = 0,$adds = ''){
		$number=1;
		$child = $this->getChild($myid);
		if(is_array($child)){
		    $total = count($child);
			foreach($child as $id=>$a){
				$j=$k='';
				if($number==$total){
					$j .= $this->icon[2];
				}else{
					$j .= $this->icon[1];
					$k = $adds ? $this->icon[0] : '';
				}
				$spacer = $adds ? $adds.$j : '';		
				@extract($a);
			    if($sid!=0)$selected = $id==$sid ? 'selected' : '';
				if($is_list==1)
				{
				  eval("\$nstr = \"$str\";");
				}else
					{
					  eval("\$nstr = \"$str2\";");
				    }
				$this->ret .= $nstr;
				$nbsp = $this->nbsp;
				$this->getTreeOptions($id, $str,$str2,$sid, $adds.$k.$nbsp);
				$number++;
			}
		}
		return $this->ret;
	}

}
?>